package indicator

// EMA 指数移动平均值（EMA）
type EMA struct {
	n   float64
	val float64
}

func NewEMA(n int32) *EMA {
	return &EMA{n: float64(n)}
}

func NewEMA2(n int32, val float64) *EMA {
	return &EMA{n: float64(n), val: val}
}

func (ema *EMA) Update(price float64, lastEma *EMA) float64 {
	if lastEma == nil {
		ema.val = price
	} else {
		// EMA（12）=前一日EMA（12）×11/13+今日收盘价×2/13
		// ema.val = ((price-lastEma.val)*2.0 + lastEma.val*(ema.n-1.0)) / (ema.n + 1.0)
		// EMA（今日）=（价格（今日） - EMA（昨日））× 加权因子 + EMA（昨日）
		ema.val = (price-lastEma.val)*2.0/(lastEma.n+1) + lastEma.val
	}
	return ema.val
}

func (ema *EMA) GetValue() float64 {
	return ema.val
}
